#!/usr/bin/python
# -*- coding:utf-8 -*-

import sys
reload(sys)
sys.setdefaultencoding('utf8')

import os
import random
import numpy
import matplotlib.pyplot as plt
from skimage import io,data


# first solution
'''
# 这里做随机按照8-2的比例将原始的数据分成训练集和测试集
with open("/media/canran/数据集盘/AI_classification/all.txt", 'rt') as handle:
    	dataset = [map(int, ln.split()) for ln in handle]
 
# 乱序
random.shuffle(dataset)
 
# [训练集, 测试集]
pos = len(dataset) *.8
parts = dataset[:pos], dataset[pos:]

'''



# second solution
f = open("/media/canran/数据集盘/AI_classification/all.txt")

'''
# 每次只读取一行，通常比 .readlines() 慢得多。仅当没有足够内存可以一次读取整个文件时用
line = f.readline()    
dataset = []
'''
# readlines()方法读取整个文件所有行，保存在一个列表(list)变量中
# 每行作为一个元素，但读取大文件会比较占内存
lines = f.readlines()
dataset = []
print(type(lines))
for line in lines:
    line = line[:-1]
    dataset.append(line.split(' ',1))
f.close()

'''
#对于每一行(也就是每一张图片)
while line:
    line = line[:-1]    # 常用在从文本读入数据的时候消除换行符的影响，用于除去末尾的换行符
    #dataset = line.split(' ', 1)
    dataset.append(line.split(' ',1))
'''

# 乱序，多维矩阵中，只对第一维（行）做打乱顺序操作
print("The num of dataset is %s." %(len(dataset)))            #此处应该是11903张
random.shuffle(dataset)
 
# 生成[训练集, 测试集]的list
pos = len(dataset) *.8               #11903*0.8=9522.4张，不是整数
# pos为前80%的data，因为可能总数乘以0.8不是整数，不能进行分隔，所以要加上round和int进行取整
pos = round(pos)                    #四舍五入，9522.4张为9522.0张
pos = int(pos)                      #取整，9522.0张为9522张
print("The num of pos is %s." %(pos)) 
# 前80%的data(9522张)做train，后20%的data(2381张)做test
train, test = dataset[:pos], dataset[pos:]       
print("The num of train dataset is %s." %(len(train))) 
print("The num of test dataset is %s." %(len(test))) 


#对于train，将list写入到train.txt中
file = open('train.txt',mode='a')
for i in range(len(train)):
    file.write(str(train[i][0])+' '+str(train[i][1])+'\n')
file.close()

#对于test，将list写入到test.txt中
file = open('test.txt',mode='a')
for j in range(len(test)):
    file.write(str(test[j][0])+' '+str(test[j][1])+'\n')
file.close()


# 指定train/test图像的读取目录
train_test_readname = '/media/canran/数据集盘/AI_classification/总数/'



# 指定处理之后的train图像的保存目录
train_savename = '/media/canran/数据集盘/AI_classification/data/train/'
# 指定处理之后的test图像的保存目录
test_savename  = '/media/canran/数据集盘/AI_classification/data/test/'



# 将自己指定的目录与原始的图像名这两个字符串连接起来，然后进行保存
#for tarin
for single in train:
    train_last_readname = os.path.join(train_test_readname, single[0])
    image = io.imread(train_last_readname)
    tarin_last_savename = os.path.join(train_savename, single[0])
    #plt.savefig(tarin_last_savename)
    #plt.show()
    io.imsave(tarin_last_savename, image)
print('train_data done！！')


#for test
for single2 in test:
    test_last_readname = os.path.join(train_test_readname, single2[0])
    image2 = io.imread(test_last_readname)
    test_last_savename = os.path.join(test_savename, single2[0])
    #plt.savefig(test_last_savename)
    #plt.show()
    io.imsave(test_last_savename, image2)
print('test_data done！！')


print('Deal with images: %s 张' %len(dataset))








'''
# 原始图像(真人和假人)全部保存在/media/canran/数据集盘/AI_classification/目录下的all.txt文件中
# 打开all.txt文件
f = open("/media/canran/数据集盘/AI_classification/all.txt")
# 每次只读取一行，通常比 .readlines() 慢得多。仅当没有足够内存可以一次读取整个文件时用
line = f.readline()    

#对于每一行(也就是每一张图片)
while line:
    count_times += 1    # 用于最后统计图片的总数  
    line = line[:-1]    # 常用在从文本读入数据的时候消除换行符的影响，用于除去末尾的换行符
    print line
    print '***********************************************************'
    image = caffe.io.load_image(line)
    
    # 定义一个字典，以空格为间隔符，对每行的图片进行分隔
    # 把提取出来的前半部分作为key，提取出来的后半部分作为value
    # 即img_name作为key，img_label作为value
    data_dict = {}
    img_name = []
    img_label = []
    img_name.append(self.data_dict[self.img_name[index]])
    img_label.append(self.data_dict[self.img_name[index]])

    # start time
    start = time.clock()



# 此处做一系列的处理

# 此处做一系列的处理



    # end time
    end = time.clock()
    sum_time += (end - start)

    # draw the image
    plt.imshow(image)

 
    print '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'



# 指定处理之后的图像的保存目录
    pre_savename = '/home/shenruixue/image_test_result/'
    print (str(count_times))
# 将从txt中读取的一行字符串（包含绝对路径的图像名）进行处理，只留存最后的图像名的字符串部分，去掉绝对路径部分的字符串
# 并将自己指定的目录与原始的图像名这两个字符串连接起来，然后进行保存
    savename = os.path.join(pre_savename, line[28:])
    print 'line is '
    print line
    print 'savename is '
    print savename
    savefig(savename)
    #io.imsave(savename, image)
# 继续读取下一行的图像名称
    line = f.readline()
    print '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'


    plt.pause(1)
    plt.close()

print('Running time: %s s' %sum_time)
print('Deal with images: %s 张' %count_times)
print('mean time: %s s' %(sum_time / count_times)) 

'''
